﻿#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<locale.h>
#include<stdbool.h>
#include<assert.h>
#include<time.h>
//设置墙的行与列的宏
#define ROWS 27//27行
#define COLS 58//58列
//设置墙体的左上角开始坐标
#define START_X 2
#define START_Y 2
//设置代表蛇运动方向的枚举
typedef enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
}DIRECTION, *pDIRECTION;
//设置表示当前游戏状态的枚举
typedef enum GAME_STATUS
{
	RUN_NORMAL = 1,
	KILL_BY_WALL,
	KILL_BY_SELF,
}GAME_STATUS, *pGAME_STATUS;
//设置蛇节点的结构体
typedef struct SnackNode
{
	int _x;
	int _y;
	struct SnackNode* next;
}SnackNode, * pSnackNode;
//将贪吃蛇游戏的重点内容封装到Game_Snack结构体中
typedef struct Game_Snack
{
	pSnackNode pheadsnack;
	pSnackNode pfood;
	DIRECTION dir;
	GAME_STATUS game_status;
	int total_​score;
	int food_score;
	int sleep_time;
}Game_Snack, * pGame_Snack;
//将查询按键刚刚是否按下的API设为宏函数
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 1) ? 1 : 0)
//将设置光标位置的API与存储坐标的结构体结合，创建设置光标位置的函数
void SetPos(short x, short y);
//初始化控制台界面
void InitConsole();
//设置欢迎界面
void WelcomeScreen();
//设置游戏规则介绍界面
void ShowGameInstructions();
//设置游戏界面
void GameScreen(pGame_Snack pgame_snack);
//打印食物分数与总分
void PrintScore(pGame_Snack pgame_snack);
//创建蛇
pSnackNode Snack();
//判断该坐标是否为蛇
bool IsSnack(int x, int y, pSnackNode pheadsnack);
//判断坐标是否位蛇尾
bool IsSnackTail(int x, int y, pSnackNode pheadsnack);
//判断该坐标是否为墙
bool IsWall(int x, int y);
//判断该坐标是否为食物
bool IsFood(int x, int y, pSnackNode pfood);
//设置食物
pSnackNode Food(pSnackNode pheadsnack);
//打印食物
void PrintFood(pGame_Snack pgame_snack);
//打印蛇
void PrintSnack(pGame_Snack pgame_snack);
//输出蛇移动的下一个节点
pSnackNode NextSnackNode(pGame_Snack pgame_snack);
//正常情况下打印蛇前进一步
void NormalPrint(pGame_Snack pgame_snack, pSnackNode next_snack_node);
//暂停游戏
void Stop();



